iT邦幫忙

2026 iThome 鐵人賽

DAY 11
0
AI Engineering

一天一個 PR,讓我告訴你嵌入式開發的殘酷:如何為 AI Agent 建立可信的工程閉環系列 第 11

Day 11 - 54% 的 Workbook 根本不用上板測:我們卻先叫 DUT 證明「不用測」

  • 分享至 

  • xImage
  •  

系列說明 >> 本系列大部分 PR 來自私人或公司專案,部分程式碼、環境設定與實作細節不便公開。

我只能保證文中提到的 PR 與問題皆為真實案例,但會經過必要的匿名化與內容調整。

本系列主要分享問題如何被發現、背後的思考方式,以及解法如何形成,不會深入討論完整實作與部署細節,敬請見諒。

Today’s Change

  • Base Repo: testpilot-core

  • Change Ref: wifi_llapi PR #130-feat(audit): P1 workbook 對接

  • Issue: Audit 已經能找到正確的 Case,但 Workbook 的欄位與 Verdict 語意仍靠操作者記憶;大量根本不需要 Live Run 的 Row,仍會照流程準備環境、Upgrade FW、占用 DUT/STA。

  • Root Cause: Workbook 被當成資料來源,卻沒有把「欄位代表什麼」以及「哪些 Verdict 真的需要 Runtime 驗證」變成明確規則。

  • Solution: 加入 --profile base0410 固化欄位、統一歷史 Verdict 詞彙,並在 Live Run 前先分流 Not SupportedSkipTo Be Tested;Workbook Index 同時改成 bounded scan。

  • Evidence: Base0410 約可省下 54% Live Runs;Workbook 掃描約由 17 秒降到 0.22 秒。Audit Tests 最終 235 passed


Target

上一篇才剛找到路,這次先不要急著 Upgrade FW

上一篇,我們總算把 Audit Pipeline 從舊 Repo Layout 拉回現在真正的 Case 路徑。

至少 TestPilot 不會再拿著:

plugins/wifi_llapi/cases/

去找早就搬到:

wifi_llapi/cases/

的檔案。

路終於接回來了。

那接下來應該可以開始 Audit 了吧?

理論上。

結果真正把 Workbook 丟進去後,第一個卡住我的不是 DUT,也不是 Serial。

是 Excel。

Agent 看著 Workbook。

「哪一欄是 API?」

「C。」

「5G、6G、2.4G 的結果?」

「R、S、T。」

老Go在旁邊問:

「所以每次跑 Automation 前,都要先來問你?」

「……目前是。」

好哦!!

這樣應該也算 Human in the loop 吧?


七個欄位,原來也是 Environment

這份 Workbook 本來就是工程文件,不是為 Parser 設計的。

裡面同時留著不同世代的 Result Columns,Header 也不是工具原本期待的簡單名稱。

人類打開 Excel,大概幾秒就能理解:

Object         → A
API            → C
Test Steps     → G
Command Output → H
5G Result      → R
6G Result      → S
2.4G Result    → T

問題是,這些對應以前沒有真正存在系統裡。

每次跑 Audit,都可能再靠操作者重新告訴工具一次。

這次加上的:

--profile base0410

其實沒有什麼高深技術。

它只是把這份 Workbook 的 Sheet 與七個欄位定義正式記下來。

如果真的有特殊情況,仍然可以用 --col-* 覆寫;正常情況則不用每次重新背 A、C、G、H、R、S、T。

而且解析完成後,真正使用的設定會跟著 RID 寫進 Manifest。

這一點反而比 Profile 本身重要。

未來 Profile 就算改了,舊 RID 重跑時還是知道:

當時到底是用哪一組 Workbook 定義跑的。

上一篇固定的是 Case Path。

這一篇固定的,則是 Workbook 的讀法。

都是同一件事:

不要再把 Environment 藏在人腦裡。


然後我們發現,有一半根本不用 Upgrade FW

欄位對好後,pass12 終於能正常讀 Workbook。

歷史 Workbook 裡還有一些 FailFailedNot SupportNot Supported 之類的詞彙差異。

這種就先 Normalize 掉。

真正讓我停下來的是另外一件事。

Workbook 裡很多 Row 根本不是:

Pass
Fail

而是:

Not Supported
Skip
To Be Tested

這幾個字其實已經把事情講完了。

但原本的流程還是:

讀 Workbook
    ↓
準備 Test Environment
    ↓
Upgrade FW / 執行 Live Run
    ↓
操作 DUT / STA
    ↓
取得 Runtime Result
    ↓
再跟 Workbook 比

也就是說,一條 Workbook 已經寫著:

Not Supported

的 Case,我們還是會先照正常測試流程準備環境、占住設備、跑一輪,最後才發現:

「喔,這題原來不用測。」

……

這流程非常嚴謹。

嚴謹到連「不用做」都要先做一次才能確認。

老Go看著我。

「你們 Testbed 很閒嗎?」

沒有。

一點都不閒。


Upgrade FW 不是拿來當昂貴版 if

所以這次真正有感的改變,是把判斷搬到 Live Run 前面。

流程從:

Workbook
→ Upgrade FW / Live Run
→ 再判斷結果該怎麼處理

改成:

Workbook Row
    ↓
Pre-classification
    ↓
Not Supported / Skip / To Be Tested
    → 直接分流

Pass / Fail
    → 進 Live Run

這些提前分流的 Row,不代表已經 Audit PASS。

也不會因此直接進 apply

它只是在告訴 TestPilot:

這個問題不需要先 Upgrade FW,再拿 Runtime Result 回來回答。

以當時 Base0410 的資料分布來看,大約有 54% 的 Row 可以在進入 Live Run 前先離開。

看到這個數字,心情當然很好。

少一半。

少一半環境準備。

少一半 DUT/STA 使用時間。

Agent 也可以少等一半。

Perfect。

嗯。

這系列寫到現在,看到 Perfect 大概就知道準備出事了。


54% 很爽,最怕把該跑的也一起省掉

第一版 Pre-classification 很直覺:

看 Workbook 三個 Band 的 Result。

如果它屬於 Not SupportedSkipTo Be Tested 這種 Runtime 無法 Confirm 的類型,就先分流。

問題是:

Case 不一定測三個 Band。

例如某條 Case 只有:

bands:
  - 5g

但 Workbook 仍然保留完整三欄:

5G   : Pass
6G   : Pass
2.4G : Not Supported

如果分類器三欄全部一起看,就可能被那個其實跟這條 Case 無關的 2.4G : Not Supported 帶走。

最後變成:

5G 明明需要 Live Run
        ↓
看到 out-of-scope 的 Not Supported
        ↓
提前分流
        ↓
該跑的測試直接消失

速度真的變快了。

畢竟最快的 Test,就是不要 Test。

老Go看了一眼。

「Optimization 成功。」

「閉嘴。」

所以這次真正重要的不是「省 54%」。

而是補上另一個條件:

先看這條 Case 真正負責哪些 Band。

Pre-classification 只處理 Case Scope 內的結果。

而且規則改得更保守:

只要有效範圍內還存在 PassFail,就不能跳過 Live Run。

只有全部有效結果都屬於 Not SupportedSkipTo Be Tested,才可以提前分流。

後續 Adversarial Review 又繼續往這個邊界戳。

如果 bands 本身格式錯了呢?

例如出現未知 Band,或者格式根本不符合預期。

以前有些情況還可能退回預設行為繼續跑。

現在直接:

block

不知道,就是不知道。

不要因為想省一次 Upgrade FW 和 Live Run,就順便把 Correctness 也省掉。

後來又抓到 Mixed Row 的情境:Case 沒有明確宣告 Band Scope,但 Workbook 同時存在 PassNot Supported

最後規則仍然一樣:

只要還有任何可以被 Runtime 驗證的 Pass/Fail,就跑。

54% 是可以省掉的成本。

不是 KPI。


Excel 自己還藏了一個五十七萬列的驚喜

Live Run 的問題處理完後,還有另一個比較單純的浪費。

這份 Workbook 真正的資料,大概只到七百多列。

Excel 的 Used Range:

573,715 rows

……

我不知道這份 Excel 過去經歷了什麼。

也不打算追究。

但舊的 build_index() 很相信它。

Excel 說五十七萬列?

那就掃五十七萬列。

每次大概:

17 sec

後來改成 Streaming Scan。

一路往下讀,只要連續遇到 200 個空 Row 就停止。

實際資料內部最大的空洞遠低於這個距離,所以仍然留著足夠的 Safety Margin。

實檔 Smoke 最後大概變成:

0.22 sec

從十幾秒變成零點幾秒當然很舒服。

但跟前面的 54% 相比,這反而只是小菜。

真正昂貴的是:

準備 Environment
Upgrade FW
占 DUT
占 STA
占 Serial
占 Agent
跑完以後
才發現這題原本就不用測

這次不是讓 Test 跑得更快,是讓不該跑的別跑

PR #130 最後留下的 Evidence,大致是:

--profile base0410
→ 可以直接初始化真實 Workbook

Workbook scan
→ 約 17s → 0.22s

Pre-classification
→ Base0410 約少 54% Live Runs

Band Scope / malformed bands / mixed row
→ 經 Adversarial Review 補齊

Audit Tests
→ 235 passed

不過 54% 這個數字還是要講清楚。

它不是:

Audit 整體快了 54%。

它代表的是:

約 54% 的 Workbook Rows,可以在 Upgrade FW、啟動 Live Run 之前,就先確認「這不是 Runtime 應該回答的問題」。

這差很多。

我們不是讓 DUT 跑得更快。

只是少叫它處理一些本來就不需要它回答的問題。

到這裡,剩下來的 Case 才真的值得花 DUT、STA 與人的時間去查。

很好。

那接下來應該只剩:

Agent 修得對不對?

了吧?

我看了一眼 verify-edit

--yaml <before>
--proposed <after>

嗯?

等一下。

before 是誰提供的?

如果 Agent 拿另外一份 YAML 當成 Before 呢?

就算 Verify 時真的是正確版本,Verify 完之後正式 Case 又被別人改掉呢?

上一篇,我們發現 Audit 拿著舊地圖。

這一篇,我們先把根本不需要 Upgrade FW 的 Case 篩掉。

下一篇則更直接。

你說你驗證過這份 YAML。

但最後被套用的,真的是同一份嗎?

Have a nice day.


上一篇
Day 10 - Case 已經搬家,Audit 還在舊 Repo 找:Tests 全綠也沒發現
下一篇
Day 12 - Agent 不能拿另一份 YAML 冒充已審核版本:不要作弊
系列文
一天一個 PR,讓我告訴你嵌入式開發的殘酷:如何為 AI Agent 建立可信的工程閉環21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言